/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.mindbox.mueblesalpes.presentacion.utils;

import com.mindbox.mueblesalpes.presentacion.sesion.SessionInfo;
import com.mindbox.mueblesalpes.presentacion.sesion.SessionWeb;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

/**
 * Utilidades para verificar sesión WEB.
 * @author jsanchez
 */
public abstract class UtilidadesSesion {

    /**
     * Verifica la sesion web para listar productos.
     * @return
     */
    public static SessionInfo verificarSessionInfo() {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession httpSession = (HttpSession) context.getExternalContext().getSession(true);
        SessionInfo sesionWeb = (SessionInfo) httpSession.getAttribute(SessionInfo.class.getName());
        if (sesionWeb == null) {
            sesionWeb = new SessionInfo();
            httpSession.setAttribute(SessionInfo.class.getName(), sesionWeb);
        }
        return sesionWeb;
    }

    /**
     * Verifica la session Web en cuanto al usuario y el cliente, para saber
     * hacia donde se debe dirigir en la proxima pantalla.
     * @param sesion
     * @return regla de navegación al agregar
     */
    public static String verificarRedireccionamientoWebAlAgregar(SessionInfo sesion) {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession httpSession = (HttpSession) context.getExternalContext().getSession(true);
        String reglaNavegacion = "";
        if (sesion.getUsuario() == null) {
            // No se ha logeado
            //Se envía  a la página de logeo
            httpSession.setAttribute(RequestParameters.next_page.name(), ReglasNavegacion.agregar_al_carrito.name());
            reglaNavegacion = ReglasNavegacion.autenticacion_compra.name();
        } else if (sesion.getCliente() == null) {
            //Error el usuario no tiene registrado un cliente.
            //Se envía  a la página de registro cliente
            httpSession.setAttribute(RequestParameters.next_page.name(), ReglasNavegacion.agregar_al_carrito.name());
            reglaNavegacion = ReglasNavegacion.registro_compra.name();
        } else {
            //El usuario ya está logeado y tiene un cliente asociado
            //Se agrega en el carrito de compras
            reglaNavegacion = ReglasNavegacion.agregar_al_carrito3.name();
        }
        return reglaNavegacion;
    }

    /**
     * Verifica la sesion web para listar productos.
     * @return boolean - indica si es valido el usuario en la sesión y al mismo tiempo muestra mensajes de error.
     */
    public static boolean verificarSessionInfoAlAgregar() {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession httpSession = (HttpSession) context.getExternalContext().getSession(false);
        SessionInfo sesion = (SessionInfo) httpSession.getAttribute(SessionInfo.class.getName());
        boolean ret = true;
        if (sesion == null) {
            //ERRROR
            //TODO Traer msg del properties
            Mensajes.asignarMensajeError("No tiene sesión asignada");
            ret = false;
        } else {
            //Validar usuario y cliente
            if (sesion.getUsuario() == null) {
                //TODO Traer msg del properties
                Mensajes.asignarMensajeError("No se ha autenticado el usuario");
                ret = false;
            }
            if (sesion.getCliente() == null) {
                //TODO Traer msg del properties
                Mensajes.asignarMensajeError("No se ha registrado como cliente");
                ret = false;
            }
        }
        return ret;
    }

    /**
     * Obtiene el Objeto SessionWeb
     * @param context
     * @return
     */
    public static SessionWeb getSessionWeb(FacesContext context) {
        return (SessionWeb) ((HttpSession) context.getExternalContext().getSession(false)).getAttribute(SessionWeb.class.getSimpleName());
    }

    /**
     * Indica si se puede efectuar una compra al agregar un mueble.
     * @param sesionInfo
     * @param sesionWeb
     * @param validoUsuario
     * @return
     */
    public static boolean puedeEfectuarCompraAlAgregar(SessionInfo sesionInfo, SessionWeb sesionWeb, boolean validoUsuario) {
        if (sesionInfo != null && sesionWeb != null && validoUsuario) {

            sesionWeb.validarAgregarMuebleSeleccionado();

            if (validoUsuario && sesionWeb.cantidadItemsCarrito() > 0) {
                return true;
            } else {
                return false;
            }
        }
        return false;
    }

    /**
     * Verifica si la session Web es valida al momento de pagar.
     * @param sesionInfo
     * @param sesionWeb
     * @return boolean - indica si es válida la sesión y al mismo tiempo muestra mensajes de error.
     */
    public static boolean verificarSesionInfoAlPagar(SessionInfo sesionInfo, SessionWeb sesionWeb) {
        boolean ret = true;
        if (sesionInfo == null) {
            //ERRROR
            //TODO Traer msg del properties
            Mensajes.asignarMensajeError("No tiene sesión asignada");
            ret = false;
        } else {
            //Validar usuario y cliente
            if (sesionInfo.getUsuario() == null) {
                //TODO Traer msg del properties
                Mensajes.asignarMensajeError("No se ha autenticado el usuario");
                ret = false;
            }
            if (sesionInfo.getCliente() == null) {
                //TODO Traer msg del properties
                Mensajes.asignarMensajeError("No se ha registrado como cliente");
                ret = false;
            }
            if (sesionWeb == null || sesionWeb.getVenta() == null) {
                //TODO Traer msg del properties
                Mensajes.asignarMensajeError("No se ha realizado ninguna venta");
                ret = false;
            }
        }
        return ret;
    }
}